import moment from "moment";
// 时间视图的常量

// 每格代表的时间
// 0 - 1天
// 1 - 12小时
// 2 - 6小时
// 3 - 2小时
// 4 - 1小时
// 5 - 30分钟
// 6 - 15分钟
// 7 - 10分钟
const STEP_PERTIME = [
  86400000,
  43200000,
  21600000,
  7200000,
  3600000,
  1800000,
  900000,
  600000
]

// 获取每格时间
function getPerTime(step = 0) {
  const perTime = STEP_PERTIME[step]
  return perTime ? perTime : STEP_PERTIME[0]
}

// 获取x轴时间的数组
// 默认总时间为1周
function getXItems(step, totalTime = 86400000 * 7) {
  const perTime = getPerTime(step)


  let startTime = moment(moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss')).valueOf() // 已今天00:00作为开始时间
  const endTime = startTime + totalTime
  let xitems = []
  while (startTime < endTime) {
    // 第一种方式采取日期其他采取时间
    xitems.push(step === 0 ? moment(startTime).format('DD/MM/YY') : moment(startTime).format('HH:mmA'))
    startTime += perTime
  }

  return xitems
}

// 生成TimeView展示数据
// list - 源数据
// {step, totalTime} - 当前时间颗粒度及展示时间范围
// {startDate, endDate, week} - 设置的开始日期、结束日期、星期
// 最终返回元素数组应是下列结构
// [{startMs: 开始毫秒, duringMs: 总时长, data: [list中符合的数据副本] }]
function getDisplayData(list,  {step, totalTime}, {startDate, endDate, week}) {
  let oneDayMap = {} // 一天内的时间分布索引
  let _list = list.slice().sort((a, b) => { // 以开始时间降序排列
    return moment(a.startTime, 'HH:mm:ss').valueOf() - moment(b.startTime, 'HH:mm:ss').valueOf()
  })
  _list.forEach(element => { // 生成一天内时间索引
    const {startTime, endTime} = element
    if (oneDayMap[`${startTime}-${endTime}`]) {
      oneDayMap[`${startTime}-${endTime}`].push(element)
    } else {
      oneDayMap[`${startTime}-${endTime}`] = [element]
    }
  })

  const displayStartTime = moment(moment().set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss')).valueOf()
  const displayEndTime = displayStartTime + totalTime
  const limitStartTime = startDate 
    ? moment(moment(startDate).set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss')).valueOf() 
    : displayStartTime
  const limitEndTime = endDate
    ? moment(moment(endDate).add(1, 'day').set({'h': 0, 'm': 0, 's': 0}).format('YYYY-MM-DD HH:mm:ss')).valueOf()
    : displayEndTime
  
  // 判断两个边界
  // 设置开始时间大于展示时间或者设置结束时间小于展示时间
  // 返回空
  if (displayStartTime >= limitEndTime || displayEndTime <= limitStartTime) {
    return []
  }

  const _endTime = displayEndTime > limitEndTime ? limitEndTime : displayEndTime // 结束极限
  const dtime = 86400000 // 时间间隔 默认一天
  let _nowTime = displayStartTime < limitStartTime ? limitStartTime : displayStartTime // 开始时间
  
  const outArr = []

  function _passWeek(ms) { // 看是否满足星期的限制
    let _week = moment(ms).day()
    _week = _week === 0 ? '7' : `${_week}`
    return week.indexOf(_week) > -1
  }

  while (_nowTime < _endTime) {
    if (_passWeek(_nowTime)) {
      for (const timeRange in oneDayMap) {
        const [_stime, _etime] = timeRange.split('-')
        const _sms = moment(moment(_nowTime).format(`YYYY-MM-DD ${_stime}`)).valueOf() // 开始毫秒
        const _ems = moment(moment(_nowTime).format(`YYYY-MM-DD ${_etime}`)).valueOf() // 结束毫秒
        outArr.push({
          startMs: _sms - displayStartTime,
          duringMs: _ems - _sms,
          data: oneDayMap[timeRange],
          timeRange
        })
      }
    }
    _nowTime += dtime
  }

  return outArr
}



export default {
  getPerTime,
  getXItems,
  getDisplayData
}
